home *** CD-ROM | disk | FTP | other *** search
/ Hot Super Models / Hot Super Models.iso / unix / x11 / xv200.tar / xv-2.00 / bggen.c next >
C/C++ Source or Header  |  1992-01-02  |  4KB  |  133 lines

  1. /*
  2.  * bggen.c  -  a program that generates backgrounds for use with XV
  3.  *
  4.  * by John Bradley, University of Pennsylvania
  5.  *   (bradley@cis.upenn.edu)
  6.  *
  7.  *      Rev: 8/31/90
  8.  *      Rev: 10/17/90  -  added '-w' option
  9.  */
  10.  
  11. /*
  12.  * Copyright 1989, 1990, 1991, 1992 by John Bradley and
  13.  *                       The University of Pennsylvania
  14.  *
  15.  * Permission to use, copy, and distribute for non-commercial purposes,
  16.  * is hereby granted without fee, providing that the above copyright
  17.  * notice appear in all copies and that both the copyright notice and this
  18.  * permission notice appear in supporting documentation.
  19.  *
  20.  * The software may be modified for your own purposes, but modified versions
  21.  * may not be distributed.
  22.  *
  23.  * This software is provided "as is" without any expressed or implied warranty.
  24.  *
  25.  * The author may be contacted via:
  26.  *    US Mail:   John Bradley
  27.  *               GRASP Lab, Room 301C
  28.  *               3401 Walnut St.
  29.  *               Philadelphia, PA  19104
  30.  *
  31.  *    Phone:     (215) 898-8813
  32.  *    EMail:     bradley@cis.upenn.edu
  33.  */
  34.  
  35.  
  36.  
  37. #include <stdio.h>
  38.  
  39. #define DEFSIZE 1024
  40. #define MAXCOLS  128
  41.  
  42. struct color { int r,g,b; int y; } cols[MAXCOLS], *cur, *nex;
  43.  
  44. int bmask[8] = { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
  45.  
  46.  
  47. main(argc,argv)
  48. int    argc;
  49. char **argv;
  50. {
  51.   int i,j,cnt,numcols;
  52.   int high = DEFSIZE;
  53.   int wide = 1;
  54.   int bits = 8;
  55.   int r, g, b;
  56.  
  57.   cnt = 0;  numcols = 0;
  58.   for (i=1; i<argc; i++) {
  59.     if (!strcmp(argv[i],"-s")) high = atoi(argv[++i]);
  60.  
  61.     else if (!strcmp(argv[i],"-w")) wide = atoi(argv[++i]);
  62.  
  63.     else if (!strcmp(argv[i],"-b")) bits = atoi(argv[++i]);
  64.  
  65.     else if (argv[i][0]=='-') break;     /* any other '-' option is unknown */
  66.  
  67.     else {
  68.       switch (cnt) {
  69.       case 0:  cols[numcols].r = atoi(argv[i]);  break;
  70.       case 1:  cols[numcols].g = atoi(argv[i]);  break;
  71.       case 2:  cols[numcols].b = atoi(argv[i]);  break;
  72.       }
  73.       cnt++;
  74.  
  75.       if (cnt==3) {
  76.     if (numcols<MAXCOLS) numcols++;
  77.     cnt = 0;
  78.       }
  79.     }
  80.   }
  81.  
  82.  
  83.   if (cnt || numcols==0 || high<1 || bits<1 || bits>8) {
  84.     fprintf(stderr,"usage:  %s [-s size] [-w width] [-b bits] %s\n\n",
  85.         argv[0], "r1 g1 b1 [r2 g2 b2 ...]");
  86.     fprintf(stderr,"\tThis will generate a WIDTHxSIZE vertical color band.\n");
  87.     fprintf(stderr,"\t(Default: 1x%d)  To set your background\n",DEFSIZE);
  88.     fprintf(stderr,"\t'bits' is the number of significant bits in the\n");
  89.     fprintf(stderr,"\tcolor specifications.  (1-8)\n");
  90.     fprintf(stderr,"\tpipe the resulting output into this cmd:\n");
  91.     fprintf(stderr,"\t\t'xv -root -quit -slow24 -'\n\n");
  92.     exit(1);
  93.   }
  94.  
  95.   printf("P3 %d %d 255\n",wide,high);
  96.  
  97.   /* special case code for numcols==1 */
  98.  
  99.   if (numcols==1) {
  100.     for (i=0; i<high; i++) 
  101.       for (j=0; j<wide; j++)
  102.     printf("%d %d %d\n",cols[0].r,cols[0].g,cols[0].b);
  103.   }
  104.   else {
  105.  
  106.     /* fill in 'y' field of cols[] */
  107.     for (i=0; i<numcols; i++)
  108.       cols[i].y = ((high-1) * i) / (numcols-1);
  109.  
  110.     cur = &cols[0];  nex = cur+1;
  111.  
  112.     for (i=0; i<high; i++) {
  113.       /* advance to next pair of colors if we're outside region */
  114.       while (nex->y < i) { cur++; nex++; }
  115.  
  116.       r = cur->r + ((nex->r - cur->r) * (i - cur->y)) / (nex->y - cur->y);
  117.       g = cur->g + ((nex->g - cur->g) * (i - cur->y)) / (nex->y - cur->y);
  118.       b = cur->b + ((nex->b - cur->b) * (i - cur->y)) / (nex->y - cur->y);
  119.  
  120.       r = r & bmask[bits-1];
  121.       g = g & bmask[bits-1];
  122.       b = b & bmask[bits-1];
  123.  
  124.       for (j=0; j<wide; j++)
  125.     printf("%d %d %d\n",r,g,b);
  126.     }
  127.   }
  128. }
  129.  
  130.  
  131.  
  132.  
  133.